/*******************************************************************************
  * 文件：OS_Kernel.c
  * 作者：zyz
  * 版本：v2.0.1
  * 日期：2020-03-24
  * 说明：内核
*******************************************************************************/

/* 头文件 *********************************************************************/
#include "OS_Kernel.h"
#include "Hardware.h"
#include "Hardware_WDT.h"

/* 宏定义 *********************************************************************/
/* 类型定义 *******************************************************************/
/* 变量定义 *******************************************************************/
static volatile U16 u16SysTick = 0;    // 系统节拍

/* 函数声明 *******************************************************************/
/* 函数定义 *******************************************************************/

/*******************************************************************************
  * 函数名：OS_Init
  * 功  能：初始化
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void OS_Init(void)
{
    // 初始化
    OS_TaskInit();     // 初始化任务
    OS_TimerInit();    // 初始化定时器
    OS_UserInit();     // 初始化用户程序
    // 创建定时器任务
    OS_TaskCreate(OS_TimerTask);
}

/*******************************************************************************
  * 函数名：OS_Run
  * 功  能：运行
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void OS_Run(void)
{
    Task_ts sTask;

    while(1)
    {
        // 重启看门狗
        Hardware_RestartWDT();

        // 获取任务
        if((OS_TaskTake(&sTask) == TRUE) && (sTask.pfHandler != NULL))
        {
            // 执行任务
            sTask.pfHandler(sTask.u32Parameter);

            // 如果是一直运行的任务
            if(sTask.eRunType == eTASK_RUN_ALWAYS)
            {
                // 运行完后再次添加到任务队列
                OS_TaskCreateEx(sTask.pfHandler, sTask.u32Parameter);
            }
        }
    }
}

/*******************************************************************************
  * 函数名：OS_UpdateSysTick
  * 功  能：更新系统节拍
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void OS_UpdateSysTick(void)
{
    // 更新系统节拍
    u16SysTick++;
}

/*******************************************************************************
  * 函数名：OS_GetSysTick
  * 功  能：获取系统节拍
  * 参  数：无
  * 返回值：节拍
  * 说  明：无
*******************************************************************************/
U16 OS_GetSysTick(void)
{
    // 返回系统节拍
    return u16SysTick;
}

/*******************************************************************************
  * 函数名：OS_DelayMs
  * 功  能：毫秒延时
  * 参  数：无
  * 返回值：无
  * 说  明：该延时会导致阻塞
*******************************************************************************/
void OS_DelayMs(U16 u16Delay)
{
    U16 u16StartTick;
    U32 u32CurrentDelay;

    // 获取节拍
    u16StartTick = u16SysTick;

    // 延时
    do
    {
        // 计算延时
        u32CurrentDelay = u16SysTick;
        u32CurrentDelay += u16MAX_VALUE;
        u32CurrentDelay -= u16StartTick;
        u32CurrentDelay %= u16MAX_VALUE;
    } while(u32CurrentDelay < u16Delay);
}

/***************************** 文件结束 ***************************************/
